home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 007 / ippon007.lzh / enemy.c next >
C/C++ Source or Header  |  2000-07-07  |  2KB  |  117 lines

  1. /* enemy.c */
  2.  
  3. #include <stdio.h>
  4. #include <xsp2lib.h>
  5.  
  6. #include "main.h"
  7. #include "player.h"
  8. #include "enemy.h"
  9.  
  10. #define ENEMY_MAX    32    /* 敵最大数 */
  11.  
  12. static ENEMY enemy[ENEMY_MAX];    /* ワーク */
  13. static ENEMY *enemy_top,    /* 使用中のワークのリスト */
  14.  *enemy_null_top,        /* 空のワークのリスト */
  15.  *enemy_end;            /* 使用中ワークのリストの末尾 */
  16.  
  17.  
  18.  
  19. /* ゲーム開始時に呼ばれる */
  20. void EnemyInit (void)
  21. {
  22.     int i;
  23.  
  24.     /* リストをつなげる */
  25.     enemy_top = NULL;
  26.     enemy_end = NULL;
  27.     enemy_null_top = enemy;
  28.     for (i = 0; i < ENEMY_MAX; i++)
  29.         enemy[i].next = &enemy[i + 1];
  30.  
  31.     enemy[ENEMY_MAX - 1].next = NULL;
  32. }
  33.  
  34.  
  35.  
  36. /* 敵出現時に呼ばれる */
  37. void EnemyAlloc (short type, signed short x, signed short y)
  38. {
  39.     ENEMY *p;
  40.  
  41.     if (enemy_null_top == NULL)
  42.         return;    /* 空きのワークがない(キャラクターオーバー) */
  43.  
  44.     /* リストの末尾に新しいノードを追加(他とは違うので注意) */
  45.     p = enemy_null_top;
  46.     enemy_null_top = p->next;
  47.     if (enemy_top == NULL)
  48.         enemy_top = p;
  49.     else
  50.         enemy_end->next = p;
  51.     p->next = NULL;
  52.     enemy_end = p;
  53.  
  54.     p->type = type;
  55.     p->lx = x << 16;
  56.     p->ly = y << 16;
  57.  
  58.     p->pt = obj_zako02;
  59.     p->info = 0x0700 | PRIORITY_ZAKO;    /* 数値を決めうちして入れるのはよくない */
  60.  
  61.     return;
  62. }
  63.  
  64.  
  65.  
  66. /* 垂直同期ごとに呼ばれる */
  67. void EnemyMove (void)
  68. {
  69.     ENEMY *p, *q;
  70.  
  71.     p = enemy_top;        /* 現在注目しているワーク */
  72.     q = NULL;        /* 1つ前のワーク(ワーク削除時に必要) */
  73.     while (p != NULL) {
  74.         /* 敵キャラの移動ルーチン */
  75.  
  76.         /* X座標を自機に近づける */
  77.         if (p->lx > player->lx)
  78.             p->lx -= 32768;
  79.         else
  80.             p->lx += 32768;
  81.  
  82.         p->ly += 2*65536;
  83.  
  84.         /* 上位ワード(固定整数部)だけ取り出す */
  85.         p->x = p->lx >> 16;
  86.         p->y = p->ly >> 16;
  87.  
  88.         if (p->y > 256+32) {    /* Y座標が 256+32 以上なら消去 */
  89.             if (q == NULL) {    /* リストの一番最初を削除 */
  90.                 enemy_top = p->next;
  91.                 p->next = enemy_null_top;
  92.                 enemy_null_top = p;
  93.                 q = NULL;
  94.                 p = enemy_top;
  95.             } else {
  96.                 if (p == enemy_end) {    /* リストの一番最後を削除 */
  97.                     q->next = NULL;
  98.                     enemy_end = q;
  99.                     p->next = enemy_null_top;
  100.                     enemy_null_top = p;
  101.                     p = q->next;
  102.                 } else {
  103.                     q->next = p->next;
  104.                     p->next = enemy_null_top;
  105.                     enemy_null_top = p;
  106.                     p = q->next;
  107.                 }
  108.             }
  109.         } else {
  110.             xobj_set_st (p);    /* 表示 */
  111.             q = p;
  112.             p = p->next;
  113.         }
  114.     }
  115.  
  116. }
  117.